У меня была такая же проблема с перенаправлением. Спасибо AJSoaks! Я попробовал, как он предложил, и проблема была решена.
Итак, я пытался опубликовать имя пользователя и пароль с помощью метода POST, и я увидел, что сервер перенаправил мой запрос. Как говорит AJSoaks, в случае ошибки 302 вы должны повторить запрос, но на этот раз, используя метод GET вместо предыдущего POST.
... в какой-то момент у вас есть следующие строки: ... он может быть внутри, если ваш метод IBAction (нажата кнопка) или где вы хотите ...
NSMutableString *postString = [[NSMutableString alloc] init];
[postString appendString:@"username=YourUsername&password=YourPassword"];
//the original URL (https means that it supports SSL protocol)
//it doesn't change anything, don't worry about it
NSURL *URL = [NSURL URLWithString:@"https://loginWebpageURL"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [postString length]] forHTTPHeaderField:@"Content-length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
[NSURLConnection connectionWithRequest:request delegate:self];
[postString release];
[request release];
Чем вы должны также реализовать метод делегата перенаправления NSURLConnection со следующей сигнатурой:
- (NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
внутри этого метода, в случае, если у вас есть ошибки СЕРВЕРА 302 или 303, вы должны реализовать что-то аналогично приведенному ниже коду, просто скопируйте код, который вы видите, и замените его новым URL (перенаправленным). Новый URL вы можете увидеть в браузере или, если хотите, он будет очень полезен, и в будущем, проверяя его с помощью Firebug (плагин Firefox) или Safari WEB INSPECTOR. Если вы используете Firebug всю информацию, которую вы можете найти в разделе «Сеть»:
if (redirectResponse) {
NSLog(@"REDIRECT");
NSMutableURLRequest *requestTmp = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://areaclienti.tre.it/selfcare/areaclienti133/4552_infoCosti_ITA_HTML.xsl"]];
return [requestTmp autorelease];
}
//return original request in case thay there is no redirecting...
else return request;
Я предполагаю, что вы имеете в виду лучшую визуализацию кода STL (а не режим отладки , который дает безопасные итераторы и дополнительные проверки времени выполнения ). Я не уверен, что вы читали эти сообщения:
Использование gdb
Начиная с версии 7.0, GDB включает поддержку написания симпатичных принтеров на Python. Симпатичные принтеры для классов STL распространяются с GCC начиная с версии 4.5.0. Самая последняя версия этих принтеров всегда находится в репозитории libstdc ++ svn. Чтобы включить эти принтеры, извлеките последние версии принтеров в локальный каталог:
Также попробуйте использовать KDevelop / DDD, если возможно - они действительно помогают.
Я не уверен, можно ли вам добавлять код , или вы просто отлаживаете код, извините. Некоторое время я писал простые служебные функции, надеюсь, вы найдете их полезными. Вы можете легко распечатать содержимое стандартных контейнеров. Код для конкретной платформы отсутствует, пример использования (собственно тест-драйвер):
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <boost/array.hpp>
#include <boost/assign.hpp>
#include "streamer.hpp"
const std::size_t consoleWidth = 80;
std::ostream& newline_if_not_console(std::ostream& outputstream)
{
if(&outputstream != & std::cout)
{
outputstream << std::endl;
}
return outputstream;
}
void STL_test_ostream(std::ostream& out)
{
using namespace boost::assign;
using namespace streamer;
double iDoubleArray[] = {0.1, 1.2, 2.3, 3.4, 4.5}; // It could be of any type!
std::vector<int> iVec;
std::list<int> iList;
std::deque<int> iDeque;
std::stack<int> iStack;
std::queue<int> iQueue;
std::priority_queue<int> iPriorityQueue;
std::set<int> iSet;
std::map<int, std::string> iMap;
iVec += 0, 1, 2, 3, 4, 5;
iList += 0, 1, 2, 3, 4, 5;
iDeque += 0, 1, 2, 3, 4, 5;
iStack += 0, 1, 2, 3, 4, 5;
iQueue += 0, 1, 2, 3, 4, 5;
iPriorityQueue += 0, 1, 2, 3, 4, 5;
iSet += 0, 1, 2, 3, 4, 5;
insert(iMap)
( 1 , "one" )
( 2 , "two" )
( 3 , "three" )
( 4 , "four" )
( 5 , "five" );
out << std::string(consoleWidth, '=') << newline_if_not_console
<< "STL Test..." << std::endl
<< std::string(consoleWidth, '=') << newline_if_not_console;
out << "Native Array = " << iDoubleArray << std::endl;
out << "vector = " << iVec << std::endl;
out << "list = " << iList << std::endl;
out << "deque = " << iDeque << std::endl;
out << "queue = " << iQueue << std::endl;
out << "stack = " << iStack << std::endl;
out << "priority_queue = " << iPriorityQueue << std::endl;
out << "set = " << iSet << std::endl;
out << "map = " << iMap << std::endl;
out << std::string(consoleWidth, '=') << std::endl;
}
void Boost_test_ostream(std::ostream& out)
{
out << std::string(consoleWidth, '=') << newline_if_not_console
<< "Boost Test..." << std::endl
<< std::string(consoleWidth, '=') << newline_if_not_console;
}
int main()
{
std::ofstream stl("STL_test_ostream.txt"),
boost("Boost_test_ostream.txt");
STL_test_ostream(std::cout);
Boost_test_ostream(std::cout);
STL_test_ostream(stl);
Boost_test_ostream(boost);
}
Я еще не писал код для контейнеров Boost. Надеюсь, я когда-нибудь это сделаю :)
Все, что вам нужно сделать, это включить этот файл ["streamer.hpp"]:
#ifndef DATASTRUCTRE_STREAMER
#define DATASTRUCTRE_STREAMER
#include <stack>
#include <queue>
#include <boost/array.hpp>
#include <functional>
#include <memory>
namespace streamer
{
// one-value data structure streaming function
template <class Container, class Stream>
Stream& printOneValueContainer(Stream& outputstream, const Container& container)
{
Container::const_iterator beg = container.begin();
outputstream << "[";
while(beg != container.end())
{
outputstream << " " << *beg++;
}
outputstream << " ]";
return outputstream;
}
// pair-value data structure streaming function
template <class Container, class Stream>
Stream& printPairValueContainer(Stream& outputstream, const Container& container)
{
Container::const_iterator beg = container.begin();
outputstream << "[";
while(beg != container.end())
{
outputstream << " " << "<" << beg->first << " , " << beg->second << ">";
beg++;
}
outputstream << " ]";
return outputstream;
}
/*
*************************************************************
C++ Standard Library
*************************************************************
*/
// Sequence Containers.
// vector, list, deque
template
< class Type
, template<class Type, class Allocator = std::allocator<Type> > class Container
, class Stream
>
Stream& operator<<(Stream& outputstream, const Container<Type>& container)
{
return printOneValueContainer(outputstream, container);
}
// Associative Containers.
// set, multiset
template
< class Key
, template<class KeyType, class Traits = std::less<KeyType>, class Allocator = std::allocator<KeyType> > class Container
, class Stream
>
Stream& operator<<(Stream& outputstream, const Container<Key>& container)
{
return printOneValueContainer(outputstream, container);
}
// map, multimap
template
< class Key, class Value
, template<class KeyType, class ValueType, class Traits = std::less<KeyType>, class Allocator = std::allocator<std::pair<const KeyType, ValueType> > > class Container
, class Stream
>
Stream& operator<<(Stream& outputstream, const Container<Key, Value>& container)
{
return printPairValueContainer(outputstream, container);
}
// Adapters.
// stack, queue
template < class Type, class Container >
const Container& container(const std::stack<Type, Container>& stack)
{
struct HackedStack : private std::stack<Type, Container>
{
static const Container& container(const std::stack<Type, Container>& stack)
{
return stack.*&HackedStack::c;
}
};
return HackedStack::container(stack);
}
template < class Type, class Container >
const Container& container(const std::queue<Type, Container>& queue)
{
struct HackedQueue : private std::queue<Type, Container>
{
static const Container& container(const std::queue<Type, Container>& queue)
{
return queue.*&HackedQueue::c;
}
};
return HackedQueue::container(queue);
}
template
< class Type
, template <class Type, class Container = std::deque<Type> > class Adapter
, class Stream
>
Stream& operator<<(Stream& outputstream, const Adapter<Type>& adapter)
{
return printOneValueContainer(outputstream, container(adapter));
}
// priority_queue
template < class Type, class Container, class Compare >
const Container& container(const std::priority_queue<Type, Container, Compare>& priorityQue)
{
struct HackedProiorityQueue : private std::priority_queue<Type, Container, Compare>
{
static const Container& container(const std::priority_queue<Type, Container, Compare>& priorityQue)
{
return priorityQue.*&HackedProiorityQueue::c;
}
};
return HackedProiorityQueue::container(priorityQue);
}
template < class Type, class Container, class Compare, class Stream >
Stream& operator<<(Stream& outputstream, const std::priority_queue<Type, Container, Compare>& adapter)
{
return printOneValueContainer(outputstream, container(adapter));
}
/*
*************************************************************
C++ Native Arrays
*************************************************************
*/
template <class Type, std::size_t size, class Stream>
Stream& operator<<(Stream& outputstream, Type (&array)[size])
{
outputstream << "[";
for(std::size_t i = 0; i < size; ++i)
{
outputstream << " " << array[i];
}
outputstream << " ]";
return outputstream;
}
/*
*************************************************************
Boost
*************************************************************
*/
}
#endif
Мой любимый способ использования GDB - это режим GDB в emacs. Вы получаете полную отладку визуального / исходного уровня, окно потока, окно стека и т.д. ... Попробуйте, вы не будете разочарованы.
Тем не менее, GDB отлично справляется с отладкой контейнеров STL без каких-либо дополнительных дополнений ... Просто убедитесь, что вы строите С -g и без -ON (любого типа) ...