移动的
如果客户端对标准的http头的某个域进行赋值可能是徒劳无功的,移动会重新对标准的头进行默认的处理,当然,每个域有固定的域值范围,选一个标准的值是没问题的。扩展自定义的域是可以的。
估计这么做的出发点是安全方面的吧
联通的
先说几个http错误吧:
400:去掉“HTTP::EHost”设置就没问题了。
500:服务器没有找到请求资源
302:加上“HTTP::EContentType”
最后进过几天的折磨终于搞定了,联通的和移动的都可以了!
post头:
_LIT8( KContentText, "text/plain");//上传字符串用
_LIT8( KContentText,"multipart/form-data");//上传文件用,例如jsp
_LIT8( KUserAgentSimpleClient, "SimpleClient 1.0" );
_LIT8( KHttpVersion11,"HTTP/1.1" );
_LIT8( KAccept,"Accept");
_LIT8(KUserAgent, "LARK/1.3.0");
RStringF method = iSession.StringPool().StringF( HTTP::EPOST,RHTTPSession::GetTable());
iTransaction = iSession.OpenTransactionL( uri, *this, method );
RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
SetHeaderL( hdr, HTTP::EUserAgent, KUserAgentSimpleClient );
SetHeaderL( hdr, HTTP::EContentType, KContentText);
SetHeaderL( hdr, HTTP::EHTTPVersion, KHttpVersion11);
SetHeaderL( hdr, _L8("Proxy-Connection"), _L8("Keep-Alive") );
SetHeaderL( hdr, _L8("AcceptType"), _L8("REGISTER") );//扩展自定义http头域
get:
SetHeaderL(hdr, HTTP::EUserAgent, KUserAgent);
SetHeaderL(hdr, HTTP::EAccept, KAccept);
SetHeaderL( hdr, _L8("Proxy-Connection"), _L8("Keep-Alive") );
下面是头域有关的方法:
void SetHeaderL(RHTTPHeaders aHeaders,
TInt aHdrField,
const TDesC8& aHdrValue)//设置标准httpheader
{
RStringF valStr = iSession.StringPool().OpenFStringL(aHdrValue);
CleanupClosePushL(valStr);
THTTPHdrVal val(valStr);
aHeaders.SetFieldL(iSession.StringPool().StringF(aHdrField,
RHTTPSession::GetTable()), val);
CleanupStack::PopAndDestroy(); // valStr
}
void SetHeaderL(RHTTPHeaders aHeaders,const TDesC8& aHdrField, const TDesC8& aHdrValue)//设置非标准httpheader
{
TInt leaveValue;
RStringF contTypeStr;
RStringF contTypeStrfield;
TRAP(leaveValue, contTypeStr = iSession.StringPool().OpenFStringL(aHdrValue));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("SetNewHeader() : StringPool().OpenFStringL() aHdrValue. TRAP"));
}
TRAP(leaveValue, contTypeStrfield = iSession.StringPool().OpenFStringL(aHdrField));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("SetNewHeader() : StringPool().OpenFStringL() aHdrField. TRAP"));
}
THTTPHdrVal contType(contTypeStr);
TRAP(leaveValue, aHeaders.SetFieldL(contTypeStrfield,contType));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("SetNewHeader() : StringPool().SetFieldL() TRAP"));
}
contTypeStr.Close();
contTypeStrfield.Close();
}
void SetHeaderL(TInt aHdrField,const TDesC8& aHdrValue)//设置标准httpheader
{
RStringF valStr = iSession.StringPool().OpenFStringL(aHdrValue);
CleanupClosePushL(valStr);
THTTPHdrVal val(valStr);
iTransaction.Request().GetHeaderCollection().SetFieldL(iSession.StringPool().StringF(aHdrField,
RHTTPSession::GetTable()), val);
CleanupStack::PopAndDestroy(); // valStr
}
void SetHeaderL(const TDesC8& aHdrField, const TDesC8& aHdrValue)//设置非标准httpheader
{
TInt leaveValue;
RStringF contTypeStr;
RStringF contTypeStrfield;
TRAP(leaveValue, contTypeStr = iSession.StringPool().OpenFStringL(aHdrValue));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("SetNewHeader() : StringPool().OpenFStringL() aHdrValue. TRAP"));
}
TRAP(leaveValue, contTypeStrfield = iSession.StringPool().OpenFStringL(aHdrField));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("SetNewHeader() : StringPool().OpenFStringL() aHdrField. TRAP"));
}
THTTPHdrVal contType(contTypeStr);
TRAP(leaveValue, iTransaction.Request().GetHeaderCollection().SetFieldL(contTypeStrfield,contType));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("SetNewHeader() : StringPool().SetFieldL() TRAP"));
}
contTypeStr.Close();
contTypeStrfield.Close();
}
TInt GetHeaderL(RHTTPHeaders aHeaders,const TDesC8& aHdrField,TDes& aVal)//获取header
{
TPtrC8 aHdrFieldSymbptr(aHdrField);
THTTPHdrVal contTypeStrValue;
TInt leaveValue;
RStringF contTypeStr;
TRAP(leaveValue, contTypeStr = iSession.StringPool().OpenFStringL(aHdrFieldSymbptr));
if (leaveValue != KErrNone )
{
User::InfoPrint(_L("GetHeader() : StringPool().OpenFStringL() TRAP"));
}
TInt headererror;
headererror = aHeaders.GetField(contTypeStr,0, contTypeStrValue);
contTypeStr.Close();
if (headererror != KErrNone || headererror == KErrNotFound)
{
return 0;
}
else
{
switch (contTypeStrValue.Type())
{
case THTTPHdrVal::KTIntVal: //< the value is a case-sensitive string
{
TBuf8<32> buf;
buf.Format(_L8("%d"),contTypeStrValue.Int());
aVal.Copy(buf);
break;
}
case THTTPHdrVal::KStrVal: //< the value is a case-sensitive string
case THTTPHdrVal::KStrFVal: //< the value is a case-insensitive string
{
RStringF tempheader;
TInt i_size=0;
tempheader = iSession.StringPool().StringF(contTypeStrValue.StrF());
TText16 buf1[128];
TPtr16 tPtr16(buf1,128);
TText16 buf2[128];
i_size = ( tempheader.DesC().Length() * sizeof(TText16)) + sizeof(TText16);
TPtr16 p16Val((unsigned short *)buf2,i_size);
p16Val.Copy(tempheader.DesC());
p16Val.PtrZ();
tPtr16.Append(p16Val);
aVal = tPtr16;
}
break;
case THTTPHdrVal::KDateVal: //< the value is a date/time
case THTTPHdrVal::KNoType: //< no value has yet been set
default :
break;
}
return 1;
}
}
void SetCookieL(RHTTPHeaders aHeaders)//设置cookie
{
RStringPool string_pool = iSession.StringPool();
RStringF cookie_rsf = string_pool.StringF(HTTP::ECookie,RHTTPSession::GetTable());
THTTPHdrVal field_value;
field_value.SetStrF (cookie_rsf);
aHeaders.SetFieldL(cookie_rsf, field_value);
THTTPHdrVal cookie_hdr;
RStringF cookie_name_rsf = string_pool.StringF(HTTP::ECookieName,RHTTPSession::GetTable());
RStringF name = string_pool.OpenFStringL (iCookieName);
cookie_hdr.SetStrF (name);
aHeaders.SetParamL (cookie_rsf, cookie_name_rsf, cookie_hdr, 0);
RStringF cookie_value_rsf = string_pool.StringF(HTTP::ECookieValue,RHTTPSession::GetTable());
RStringF value = string_pool.OpenFStringL (iCookieValue);
cookie_hdr.SetStrF (value);
aHeaders.SetParamL (cookie_rsf, cookie_value_rsf, cookie_hdr, 0);
name.Close();
value.Close();
}