Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK

2024-05-08 07:58

本文主要是介绍Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

nusoap是PHP环境中的开源soap工具,算是用得比较多的一个工具了。

    在utf-8环境中,nusoap可以工作得很好。但是当用于中文环境中时,nusoap经常会出现一些让人不得其解的问题。

    最近一个项目中,服务端是用nusoap实现的,支持UTF-8和GBK两种字符集。

    当客户端用GBK来调用服务时,出现错误:Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK,意思是说,客户端的请求中,HTTP Content-Type的字符集是US-ASCII,而soap请求的XML声明里,字符集是GBK,两者不匹配。检查soap client的request变量,HTTP Content-Type的值也是GBK,怎么会变成了US-ASCII呢?有点莫名其妙了。于是只好跟踪nusoap的源码,发现nusoap在处理HTTP Content-Type时把US-ASCII,ISO-8859-1,UTF-8以外的字符集都默认为US-ASCII。最终发现其原因是因为nusoap使用了xml parser,而xml parser只支持这几种字符集。所以客户端在调用时,当采用GBK编时,调用的HTTP Content-Type 和 soap request的字符集都应该换成ISO-8859-1。

    稍后在封装客户端时,也遇到一个类似的问题。客户端字符集声明为GBK,服务端在返回SOAP调用结果时 HTTP Content-Type和soap request都声明字符集为GBK,客户端没有获取任何值。查看soap client的response对象,发现服务端返回正确。为解决这个问题,只好修改服务端,把HTTP Content-Type和soap response的字符集都声明为ISO-8859-1。

    所以在使用nusoap时,当遇到GBK或GB2312字符集时,可以使用ISO-8859-1代替。

=============================================================================================

PHP Web Service Server端:

<?php
//header("Content-Type:text/html;charset=UTF-8");// Pull in the NuSOAP code
require_once('./lib/nusoap.php');// Define the method as a PHP function
function hello($name) {return '你好! ' . $name;
}// Create the server instance
$server = new soap_server;$server->configureWSDL('hellowsdl', 'urn:hellowsdl');
$server->wsdl->schemaTargetNamespace = 'urn:hellowsdl';// Register the method to expose
$server->register('hello',
array('name'=>'xsd:string'),
array('return'=>'xsd:string'),
'urn:hellowsdl',
'urn:hellowsdl#hello',
'rpc',
'encoded',
'Say hello to somebody'
);// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

Client 端:

<?php
//header("Content-Type:text/html;charset=GB2312");
// Pull in the NuSOAP code
require_once('./lib/nusoap.php');
// Create the client instance
$client = new soapclient('http://localhost/soapTest/helloService.php?wsdl',true);
// Call the SOAP method
$param = array("name"=>"安迪");
$result = $client->call('hello', $param);
// Display the result
//print_r($result);if(!$err=$client->getError()){print_r($result );print('</br>');echo "程序返回: ", htmlentities($result,ENT_QUOTES,GB2312);
}
else{echo "错误: ", htmlentities($result,ENT_QUOTES,GB2312);
}echo   ' <h2> Request </h2> <pre> '   .   htmlspecialchars($client-> request,   ENT_QUOTES,GB2312)   .   ' </pre> '; 
echo   ' <h2> Response </h2> <pre> '   .   htmlspecialchars($client-> response,   ENT_QUOTES,GB2312)   .   ' </pre> '; 
echo   ' <h2> Debug </h2> <pre> '   .   htmlspecialchars($client-> debug_str,   ENT_QUOTES,GB2312)   .   ' </pre> '; ?>

Java代码:

 

  注意: 要使用Axis1.x, 去官网不要下载了Axis2。好像Axis1.x 和 Axis2还是差别很大的,而且目前Axis1.x的文档比较全点。这些是网上搜到的说法。

 

  如果需要使用中文参数调用Web Service,必须使用ISO-8859-1编码参数,返回的Response再解码。不要使用别的编码,会出错!

import org.apache.axis.client.Service;<span style="color: #464646; font-family: simsun; line-height: 21px; text-align: left; white-space: normal; background-color: #ffffff;">import org.apache.axis.client.Call;</span>public class WebServiceTest {public static void main(String[] args) {String endpoint = "http://localhost/soapTest/helloService.php";//String endpoint = "http://testweb.dev.php/testWebService/testWebService.php";//该段就是上面刚将的地址 Service service = new Service();Call call;try {call = (Call) service.createCall();call.setTargetEndpointAddress(new java.net.URL(endpoint));call.setOperationName("hello");String param = new String("安迪".getBytes(),"ISO-8859-1");//如果没有加这段,中文参数将会乱码//String param = new String("中文");String s = (String) call.invoke(new Object[] {param});s = new String(s.getBytes("ISO-8859-1"));//如果没有转换编码,中文也会乱码System.out.println(s);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}



这篇关于Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969763

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

intellij idea generatorConfig.xml

generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-ge

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq